/*
 * ApplicationUtils.java
 *
 *  created: 12.8.2008
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.util.app;

import cz.mp.util.StringUtils;

/**
 *
 * @author Martin Pokorný
 * @version 0.1
 */
public class ApplicationUtils {

    /** */
    public static final boolean OS_IS_LINUX =
            System.getProperty("os.name").toLowerCase().contains("linux");

    /** */
    public static final boolean OS_IS_WINDOWS =
            System.getProperty("os.name").toLowerCase().contains("windows");
    
    /** Výchozí kódování konce řádku. */
    public static final String EOL =
            System.getProperty("line.separator");            
    
    /** Výchozí kódování znaků textových souborů. */
    public static final String DEFAULT_CHARSET =
            System.getProperty("file.encoding");
        
    /** */
    public static final String HOME_DIR = 
            System.getProperty("user.home");
            
    /** */
    public static final String JRE_VERSION = 
            System.getProperty("java.version");
    
    
    /** */
    private ApplicationUtils() {        
    }

    /**
     * Porovná dvě čísla verze programu programu. 
     * 
     * @param v1
     * @param v2
     * @return pokud je první číslo verze větší než druhé, vrací 1;
     *      pokud jsou čísla stejná, vrací 0;
     *      pokud je první číslo verze menší než druhé, vrací -1
     * @throws NumberFormatException  pokud číslo verze obsahuje jiné 
     *      znaky než číslice
     * @throws IllegalArgumentException  pokud je zadáno prázdné číslo verze
     */
    public static int compareVersions(String v1, String v2) 
            throws NumberFormatException {
        if (StringUtils.isBlank(v1)) {
            throw new IllegalArgumentException("v1 is blank");
        }
        if (StringUtils.isBlank(v2)) {
            throw new IllegalArgumentException("v2 is blank");
        }
        
        String[] v1nums = v1.split("\\.");
        String[] v2nums = v2.split("\\.");
                
        for (int i = 0; i < Math.min(v1nums.length, v2nums.length); i++) {
            if (Integer.parseInt(v1nums[i]) < Integer.parseInt(v2nums[i])) {
                return -1;
            }
            if (Integer.parseInt(v1nums[i]) > Integer.parseInt(v2nums[i])) {
                return 1;
            }
        }
        
        if (v1nums.length < v2nums.length) {    // 1.1 < 1.1.1
            return -1;
        }
        if (v1nums.length > v2nums.length) {    // 1.1.1 > 1.1
            return 1;
        }

        return 0;
    }    
    
    /**
     * Porovná verzi javy (JVM), pod kterou program běží, se zadanou hodnotou.
     * 
     * @param minRequiredJava  
     *      minimální číslo verze javy, kterou program potřebuje, aby fungoval
     * @return {@code true}, pokud je verze javy aspoň {@code minJavaVersion}, 
     *      jinak {@code false}
     */
    public static boolean isRunnedWithReqiredJava (String minRequiredJava) {
        if (StringUtils.isBlank(minRequiredJava)) {
            throw new IllegalArgumentException("minJavaVersion is blank");
        }        
        
        if (compareVersions(JRE_VERSION, minRequiredJava) >= 0) {
            return true;
        }
        return false;
    }
    
}   // ApplicationUtils.java

